package com.link.base.base.common.service;

import com.link.base.base.common.model.Menu;
import com.link.base.base.common.model.MenuAndCorpModel;
import com.link.base.base.common.model.MenuTree;
import com.link.base.base.user.model.User;
import com.link.base.user.model.CoreUser;
import com.link.core.basic.service.BasicService;
import com.link.core.basic.service.BasicServiceException;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * Copyright  hande Company. All Rights Reserved.
 * 菜单管理
 *
 * @author  unknwon
 * @date:   2018/11/9 9:23
 * @version 1.0
 */
public interface MenuService extends BasicService<Menu> {

    /**
     * 根据菜单类型获取菜单列表
     *
     * @param menuType
     * @param userId
     * @param session
     * @return List
     * @throws BasicServiceException
     */
    public List<Menu> getMenuListByMenuTyepSelect(String menuType, Long userId, HttpSession session) throws BasicServiceException;


    /**
     * 根据子菜单Id，查询安全性菜单项信息
     *
     * @param menu
     * @return List
     * @throws Exception
     */
    public List<Menu> querySubItemListByDutyItemIdSelect(Menu menu) throws Exception;

    /**
     * 查询一级菜单
     *
     * @param userId
     * @return List
     * @throws BasicServiceException
     */
    public List<Menu> queryFstMenuList(CoreUser userId) throws BasicServiceException;

    /**
     * 根据用户ID查询职责内DMS的所有菜单(包括一级和二级)
     *
     * @param userId 用户ID
     * @return List
     * @throws  Exception
     */
    public List<Menu> queryDmsMenuByUserId(Long userId) throws Exception;

    /**
     * 查询DMS一级菜单，包含嵌套了二级和三级菜单
     *
     * @param userId 用户ID
     * @return List
     * @throws  Exception
     */
    public List<Menu> queryDmsFstMenuList(Long userId) throws Exception;

    /**
     * 根据菜单类型查询一级菜单
     *
     * @param menu
     * @return menu
     * @throws BasicServiceException
     */
    public Menu queryByMenuType(Menu menu) throws BasicServiceException;

    /**
     * 根据用户查询一级至三级所有菜单
     *
     * @param user
     * @param session
     * @return 按等级组成树形结构的json格式
     * @throws Exception
     */
    public Map<String, Object> queryAllMenuByUser(CoreUser user, HttpSession session) throws Exception;

    /**
     * <p>菜单列表的只读、可添加、可修改等权限的处理计算,返回最终结果</p>
     *
     * @author yrf
     * @param list
     * @param parentList
     * @return List
     */
    public List<Menu> menuAuthProcessor(List<Menu> list, List<Menu> parentList);

    /**
     * <p>合并两个菜单列表，相同菜单不同权限配置则取大权限作为最终权限</p>
     *
     * @author yrf
     * @param menuA
     * @param menuB 该列表会被修改
     * @return Menu
     */
    public Menu menuAuthMerge(Menu menuA, Menu menuB);

    /**
     * <p>合并一个菜单到菜单列表，相同菜单不同权限配置则取大权限作为最终权限</p>
     *
     * @author yrf
     * @param menu
     * @param list 该列表会被修改
     * @return List
     */
    public List<Menu> menuAuthMerge(Menu menu, List<Menu> list);

    /**
     * 修数据，所有二级菜单下必须有安全性菜单，所有职责必须关联安全性菜单才可见页面
     * @throws Exception
     */
    public void fixData() throws Exception;

    /**
     * 获取 "userId : menuId" 关联关系字符串
     *
     * @param userId
     * @return String[]
     */
    public Long[] getUserMenuIds(Long userId);

    /**
     * 把登录用户的id与所有可访问菜单组成的"userId:menuId"字符串加到redis缓存（集合）里，访问校验时使用
     *
     * @author yrf
     * @param user
     */
    public void loadUserMenuIdsToRedis(User user);

    /**
     * 深度复制安全性菜单，复制包括菜单下关联页面及请求
     *
     * @param record
     * @return menu
     * @throws Exception
     */
    public Menu deepCopySecurityMenu(Menu record) throws Exception;

    /**
     * 指定账套，分发指定菜单（范围：一级、二级）
     * @param  menuAndCorpModel
     * @throws Exception
     */
    public void distributeMenuByAssign(MenuAndCorpModel menuAndCorpModel) throws Exception;

    /**
     * 查询当前职责内的所有DMS一级菜单以及二级菜单
     * @param entity
     * @return list
     * @throws Exception
     */
    public List<Menu> queryAllDmsMenuAndSubMenu(Menu entity) throws Exception;

    /**
     * 查询当前账套下所有菜单到安全性级别
     * @author yxl
     * @param entity
     * @return list
     * @throws Exception
     */
    public List<MenuTree> querySafetyMenuList(Menu entity) throws Exception;
}
